package com.flyduck.system.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.flyduck.common.util.IdUtil;
import com.flyduck.common.util.StringUtil;
import com.flyduck.common.util.TokenUtil;
import com.flyduck.common.vo.PageResult;
import com.flyduck.common.vo.UserInfoVO;
import com.flyduck.system.dao.SysConfigDao;
import com.flyduck.system.dao.SysConfigValueDao;
import com.flyduck.system.entity.SysConfigValueEntity;
import com.flyduck.system.enums.UserTypeEnum;
import com.flyduck.system.vo.config.*;
import com.flyduck.system.vo.config.trans.SysConfigAddReqVOToSysConfigEntity;
import com.flyduck.system.vo.config.trans.SysConfigEntityToSysConfigDetailRespVO;
import com.flyduck.system.vo.config.trans.SysConfigEntityToSysConfigRespVO;
import com.flyduck.system.vo.config.trans.SysConfigUpdateReqVOToSysConfigEntity;
import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.flyduck.system.entity.SysConfigEntity;

import java.util.Date;
import java.util.List;

@Service
public class SysConfigService {


    @Autowired
    private TokenUtil tokenUtil;
    @Autowired
    private SysConfigDao sysConfigDao;
    @Autowired
    private SysConfigValueDao sysConfigValueDao;

    /**
     * 获取参数分页
     * @param reqVo
     * @param page
     * @param size
     * @return
     */
    public PageResult<SysConfigRespVO> getConfigPageList(SysConfigReqVO reqVo, Integer page, Integer size) {
        //************************* 1.构建分页条件 *************************
        Page<SysConfigEntity> configEntityPage = new Page<>(page, size);
        //************************* 3.查询 *************************
        UserInfoVO userInfo = tokenUtil.getLoginInfo().getUserInfo();
        IPage<SysConfigEntity> configEntityIPage;
        if(UserTypeEnum.SYS_USER.getValue().equals(userInfo.getUserType())){
            configEntityIPage = sysConfigDao.getSystemConfigPageList(configEntityPage, reqVo);
        }else {
            configEntityIPage = sysConfigDao.getDeptConfigPageList(configEntityPage, reqVo,userInfo.getDeptId());
        }
        //************************* 4.结果返回转换 *************************
        List<SysConfigRespVO> respVOList = Lists.transform(configEntityIPage.getRecords(), new SysConfigEntityToSysConfigRespVO());
        return PageResult.ofPages(respVOList, configEntityIPage);
    }

    private QueryWrapper<SysConfigEntity> getConfigQueryWrapper(SysConfigReqVO reqVo) {
        QueryWrapper<SysConfigEntity> wrapper = new QueryWrapper<>();
        if (StringUtil.isNotBlank(reqVo.getConfigName())) {
            wrapper.like("config_name", reqVo.getConfigName());
        }

        return wrapper;
    }

    /**
     * 获取参数详情
     * @param id
     * @return
     */
    public SysConfigDetailRespVO getConfigDetail(Long id) {
        UserInfoVO userInfo = tokenUtil.getLoginInfo().getUserInfo();
        SysConfigEntity entity;
        if(UserTypeEnum.SYS_USER.getValue().equals(userInfo.getUserType())){
            entity = sysConfigDao.getById(id);
        }else {
            entity = sysConfigDao.getDeptConfigDetail(id,userInfo.getDeptId());
        }
        return new SysConfigEntityToSysConfigDetailRespVO().apply(entity);
    }

    /**
     * 新增参数
     * @param reqVo
     * @return
     */
    public boolean addConfig(SysConfigAddReqVO reqVo) {
        SysConfigEntity entity = new SysConfigAddReqVOToSysConfigEntity().apply(reqVo);
        entity.setId(IdUtil.getId());
        entity.setCreateName(tokenUtil.getLoginInfo().getUserInfo().getNickName());
        entity.setCreateTime(new Date());
        entity.setUpdateName(tokenUtil.getLoginInfo().getUserInfo().getNickName());
        entity.setUpdateTime(new Date());
        return sysConfigDao.save(entity);
    }

    /**
     * 修改参数
     * @param reqVo
     * @return
     */
    public boolean updateConfig(SysConfigUpdateReqVO reqVo) {
        SysConfigEntity entity = new SysConfigUpdateReqVOToSysConfigEntity().apply(reqVo);
        UserInfoVO userInfo = tokenUtil.getLoginInfo().getUserInfo();
        if(UserTypeEnum.SYS_USER.getValue().equals(userInfo.getUserType())){
            entity.setUpdateName(tokenUtil.getLoginInfo().getUserInfo().getNickName());
            entity.setUpdateTime(new Date());
            sysConfigDao.updateById(entity);
        }else {
            //先删除再新增
            sysConfigValueDao.deleteByConfigKeyAndDeptId(reqVo.getConfigKey(),userInfo.getDeptId());
            SysConfigValueEntity sysConfigValueEntity = new SysConfigValueEntity();
            sysConfigValueEntity.setConfigKey(reqVo.getConfigKey());
            sysConfigValueEntity.setDeptId(Long.valueOf(userInfo.getDeptId()));
            sysConfigValueEntity.setConfigValue(reqVo.getConfigValue());
            sysConfigValueDao.save(sysConfigValueEntity);
        }
        return true;
    }

    /**
     * 删除参数
     * @param id
     * @return
     */
    public boolean deleteConfig(Long id) {
        return sysConfigDao.removeById(id);
    }


}
